package com.atguigu.product.config;

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * description: MyRedisCacheConfig配置
 * date: 2022/11/19 9:53
 * author: MR.孙
 *
 * 解决无法读取配置文件问题:    @EnableConfigurationProperties(value= CacheProperties.class)
 *
 */
@EnableConfigurationProperties(value= CacheProperties.class)
@Configuration
public class MyRedisCacheConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties){
        //使用redis缓存默认配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        //配置redis缓存的key序列化方式
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair
                .fromSerializer(new StringRedisSerializer()));
        //配置redis缓存的value序列化方式
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair
                .fromSerializer(new GenericFastJsonRedisSerializer()));


        CacheProperties.Redis redisProperties  = cacheProperties.getRedis();
        if (redisProperties .getTimeToLive() != null) {
            config = config.entryTtl(redisProperties .getTimeToLive());
        }
        if (redisProperties .getKeyPrefix() != null) {
            config = config.prefixKeysWith(redisProperties .getKeyPrefix());
        }
        if (!redisProperties .isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties .isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;

    }

}
